package com.example.demo24_password.config;

import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;

/**
 * 在 Spring Security 中，PasswordEncoder 专门用来处理密码的加密与比对工作，我们自定义 MyPasswordEncoder 并实现 PasswordEncoder 接口，
 * 还需要实现该接口中的两个方法：
 *      encode 方法表示对密码进行加密，参数 rawPassword 就是你传入的明文密码，返回的则是加密之后的密文，这里的加密方案采用了 MD5。
 *      matches 方法表示对密码进行比对，参数 rawPassword 相当于是用户登录时传入的密码，encodedPassword 则相当于是加密后的密码（从数据库中查询而来）。
 * 最后记得将 MyPasswordEncoder 通过 @Component 注解标记为 Spring 容器中的一个组件。这样用户在登录时，就会自动调用 matches 方法进行密码比对。
 *
 * 一般来说煮自己定义 PasswordEncoder 还是有些麻烦，特别是处理密码加盐问题的时候。
 * 所以在 Spring Security 中提供了 BCryptPasswordEncoder，使得密码加密加盐变得非常容易。
 */
//@Component
public class MyPasswordEncoder implements PasswordEncoder {
    @Override
    public String encode(CharSequence rawPassword) {
        return DigestUtils.md5Hex(rawPassword.toString().getBytes(StandardCharsets.UTF_8));
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        return encodedPassword != null && encodedPassword.equals(DigestUtils.md5Hex(rawPassword.toString().getBytes(StandardCharsets.UTF_8)));
    }
}
